package com.jhxy.algorithm.majorityelement;

/**
 * Date: 2024/3/11 15:25
 * Author: T_log
 * Description: 多数元素_摩尔投票法
 * <p>
 * 摩尔投票法思路
 * 候选人(cand_num)初始化为 nums[0]，票数 count 初始化为 1。
 * 当遇到与 cand_num 相同的数，则票数 count = count + 1，否则票数 count = count - 1。
 * 当票数 count 为 0 时，更换候选人，并将票数 count 重置为 1。
 * 遍历完数组后，cand_num 即为最终答案。
 * 为何这行得通呢？
 * 投票法是遇到相同的则 票数 + 1，遇到不同的则 票数 - 1。
 * 且“多数元素”的个数 > ⌊ n/2 ⌋，其余元素的个数总和 <= ⌊ n/2 ⌋。
 * 因此“多数元素”的个数 - 其余元素的个数总和 的结果 肯定 >= 1。
 * 这就相当于每个 “多数元素” 和其他元素 两两相互抵消，抵消到最后肯定还剩余 至少1个 “多数元素”。
 * 无论数组是 1 2 1 2 1，亦或是 1 2 2 1 1，总能得到正确的候选人。
 * </p>
 */
public class MoleVote {


    public int majorityElement(int[] nums) {
        int majorCnt = nums[0];
        int count = 1;

        for (int i = 1; i < nums.length; i++) {
            if (majorCnt == nums[i]) {
                count++;
            } else {
                count--;
                if (count == 0) {
                    majorCnt = nums[i];
                    count = 1;
                }
            }
        }

        return majorCnt;
    }
}
